package com.kk.springmvc.demo.common.utils;

import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.serializer.JSONLibDataFormatSerializer;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;

/**
 * fastjson工具类
 * 
 * @author chengkai
 * @since 2017/3/31
 *
 */
public class FastJsonUtils {

    private static final SerializeConfig config;

    static {
        config = new SerializeConfig();
        config.put(java.util.Date.class, new JSONLibDataFormatSerializer()); // 兼容json-lib时间格式
        config.put(java.sql.Date.class, new JSONLibDataFormatSerializer()); // 兼容json-lib时间格式
    }

    private static final SerializerFeature[] features = { SerializerFeature.WriteMapNullValue, // 输出空置字段
            SerializerFeature.WriteNullStringAsEmpty, // 字符类型为null时,输出""
            SerializerFeature.WriteNullListAsEmpty, // 集合字段为null时,输出[]
            SerializerFeature.WriteNullNumberAsZero, // 数值类型为null时,输出0
    };

    /**
     * 将对象转换为字符串
     * 
     * @param object 对象
     * @return 字符串
     */
    public static String toJSONString(Object object) {
        return JSON.toJSONString(object, config, features);
    }

    /**
     * 将对象转换为字符串(无序列化特征)
     * 
     * @param object 对象
     * @return 字符串
     */
    public static String toJSONNoFeatures(Object object) {
        return JSON.toJSONString(object, config);
    }

    /**
     * 将字符串转换为Object对象
     * 
     * @param text Json字符串
     * @return 对象
     */
    public static Object toBean(String text) {
        return JSON.parse(text);
    }

    /**
     * 将字符串转换为指定类型对象
     * 
     * @param text Json字符串
     * @param clazz 指定类型
     * @return 对象
     */
    public static <T> T toBean(String text, Class<T> clazz) {
        return JSON.parseObject(text, clazz);
    }

    /**
     * 将字符串转换为Object数组
     * 
     * @param text Json字符串
     * @return Object数组
     */
    public static Object[] toArray(String text) {
        return toArray(text, null);
    }

    /**
     * 将字符串转换为指定类型数组
     * 
     * @param text Json字符串
     * @param clazz 指定类型
     * @return 数组
     */
    public static <T> Object[] toArray(String text, Class<T> clazz) {
        return JSON.parseArray(text, clazz).toArray();
    }

    /**
     * 将字符串转换为指定类型列表
     * 
     * @param text Json字符串
     * @param clazz 指定类型
     * @return 列表
     */
    public static <T> List<T> toList(String text, Class<T> clazz) {
        return JSON.parseArray(text, clazz);
    }

    /**
     * 将字符串转换为对象
     * 
     * @param text Json字符串
     * @return 对象
     */
    public static Object textToJson(String text) {
        Object objectJson = JSON.parse(text);
        return objectJson;
    }

    /**
     * 将字符串转换为Map对象
     * 
     * @param text Json字符串
     * @return Map对象
     */
    public static Map<?, ?> stringToMap(String text) {
        Map<?, ?> m = JSONObject.parseObject(text);
        return m;
    }

    /**
     * 将字符串转换为Map对象
     * 
     * @param text  Json字符串
     * @param clazz 转换类型
     * @param order 是否排序
     * @return Map对象
     */
    public static Map<?, ?> stringToMap(String text, Class<?> clazz, boolean order) {
        Map<?, ?> m = null;
        if (order) {
            m = (Map<?, ?>) JSONObject.parseObject(text, clazz, Feature.OrderedField);
        } else {
            m = (Map<?, ?>) JSONObject.parseObject(text, clazz);
        }
        return m;
    }

    /**
     * 将Map对象转换为字符串
     * 
     * @param m Map对象
     * @return Json字符串
     */
    public static String collectToString(Map<?, ?> m) {
        String text = JSONObject.toJSONString(m);
        return text;
    }

}
